package basic.chapter1;

/**
 * @author Kevin
 * @date 2020/2/20 12:42
 * 验证一下多核场景下的可见性问题
 * 我们假设线程 A 和线程 B 同时开始执行，那么第一次都会将 count=0 读到各自的 CPU 缓存里，执行完 count+=1 之后，各自 CPU 缓存里的值都是 1，同时写入内存后，我们会发现内存中是 1，而不是我们期望的 2。之后由于各自的 CPU 缓存里都有了 count 的值，两个线程都是基于 CPU 缓存里的 count 值来计算，所以导致最终 count 的值都是小于 20000 的。这就是缓存的可见性问题。
 * 是两个线程不是同时启动的，有一个时差。所以线程2的count初始值不是0，最终结果count也大于10000
 */
public class Test {
    private static long count = 0;
    private static void add10k() {
        int idx = 0;
        while (idx++ < 10000) {
            count += 1;
        }
    }
    public static long calc() throws InterruptedException {
        final Test test = new Test();
        // 创建两个线程，执行add操作
        Thread th1 = new Thread(()->{
            test.add10k();
        });
        Thread th2 = new Thread(()->{
           test.add10k();
        });
        //启动两个线程
        th1.start();
        th2.start();
        //等待两个线程执行结束
        th1.join();
        th2.join();
        return count;
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println(calc());
    }
}
